package br.com.foxinline.servico;

import br.com.foxinline.modelo.Telefone;
import br.com.foxinline.modelo.Usuario;
import br.com.foxinline.utilitario.Caracteres;
import br.com.foxinline.utilitario.Mensagem;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Principal;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.faces.context.FacesContext;
import javax.persistence.Query;

/**
 *
 * @author cadomeireles
 */
@Stateless
public class UsuarioServico extends ServicoGenerico<Usuario> {

    public UsuarioServico() {
        super(Usuario.class);
    }

    public boolean salvar(Usuario usuario, String confirmarSenha) {
        if (usuario.getSenha().equals(confirmarSenha)) {
            converterDados(usuario);

            super.salvar(usuario);

            Mensagem.messagemInfo("Usuário cadastrado com sucesso!");
            return true;
        } else {
            Mensagem.messagemError("Os campos Senha e Confirmar Senha devem ser iguais!");
            return false;
        }
    }

    public void atualizar(Usuario usuario, String confirmarSenha) {
        if (usuario.getSenha().equals(confirmarSenha)) {
            converterDados(usuario);

            super.atualizar(usuario);
            
            Mensagem.messagemInfo("Usuário atualizado com sucesso!");
        } else {
            Mensagem.messagemError("Os campos Senha e Confirmar Senha devem ser iguais!");
        }
    }

    public List<Usuario> pesquisar(Usuario usuario) {
        String sql = "select usuario from Usuario usuario where usuario.status = true";
        
        if (usuario.getNome() != null && !usuario.getNome().isEmpty()) {
            sql += " and lower(usuario.nome) like '%" + usuario.getNome().toLowerCase().trim() + "%'";
        }        

        if (usuario.getLogin() != null && !usuario.getLogin().isEmpty()) {
            sql += " and lower(usuario.login) like '%" + usuario.getLogin().toLowerCase().trim() + "%'";
        }
        
        Query query = getEntityManager().createQuery(sql);

        return query.getResultList();
    }

    @Override
    public void deletar(Usuario usuario) {
        usuario.setStatus(false);
        super.atualizar(usuario);
    }
    
    public Telefone obterTelefone(Usuario usuario) {
        String sql = "select usuario.telefone from Usuario usuario where usuario.status = true and usuario = :usuario";

        Query query = getEntityManager().createQuery(sql);

        query.setParameter("usuario", usuario);

        return (Telefone) query.getSingleResult();
    }

    private void converterDados(Usuario usuario) {
        usuario.getTelefone().setDdd(Caracteres.removecaracter(usuario.getTelefone().getDdd()));
        usuario.setCpf(Caracteres.removecaracter(usuario.getCpf()));
        usuario.setSenha(criptografarSenha(usuario.getSenha()));
    }
    
    public static String criptografarSenha(String senha) {
    StringBuilder stringBuilder = new StringBuilder();
    try {
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        byte[] bs;
        messageDigest.reset();
        bs = messageDigest.digest(senha.getBytes());

        for (int i = 0; i < bs.length; i++) {
            String hexVal = Integer.toHexString(0xFF & bs[i]);
            if (hexVal.length() == 1) {
                stringBuilder.append("0");
            }
            stringBuilder.append(hexVal);
        }
        return stringBuilder.toString();
    } catch (NoSuchAlgorithmException ex) {
        Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
    }

    return stringBuilder.toString();
}    
    
    public List<Usuario> autocompletar(String query){
        return buscarPeloNome(query);
    }

    public List<Usuario> buscarPeloNome(String query){
        List<Usuario> usuarios = getEntityManager().createQuery("select usuario from " + Usuario.class.getSimpleName() + " usuario where lower(usuario.nome) like '%" + query.toLowerCase().trim() + "%'").getResultList();
        return usuarios;
    }

    public Usuario getUsuarioPorLogin(String nome) {
        if (nome == null) {
            return null;
        }
        Usuario usr = null;
        try {
            final String sql = "select u from Usuario u where "
                    + "u.login like :nome";
            Query query = getEntityManager().createQuery(sql);
            query.setParameter("nome", nome);
            usr = (Usuario) query.getSingleResult();

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return usr;
    }
    
    public Usuario getUsuarioLogado() {
        final Principal userPrincipal = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
        if (userPrincipal != null) {
            return getUsuarioPorLogin(userPrincipal.getName());
        }

        return null;
    }
}
